<?php
require 'Lunar.php'; //此库用于阳历和阴历转换
// 参考: https://6tail.cn/calendar/api.html#solar.lunar.html
use com\nlf\calendar\Lunar;

ini_set('date.timezone','Asia/Shanghai');//需要设置时区，否则后面的date函数会无法使用
// 相关token配置
$appId = ''; //对应自己的appId，注册微信公众平台后，管理界面可见
$appSecret = ''; //对应自己的appSecret
$weather_api_appid = '123456'; // 换成自己天气api的id，方法见readme
$weather_api_appsecret = 'asdbasdf'; //换成自己天气api的secret，方法见readme
$api_token = 'xxx';  // 换成自己注册的ALAPI平台的token

// 通过id和secret获取token
$wxgzhurl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appId . "&secret=" . $appSecret;
$access_token_Arr = https_request($wxgzhurl);
$access_token = json_decode($access_token_Arr, true);
$ACCESS_TOKEN = $access_token['access_token']; //ACCESS_TOKEN

class Lover{ //定义一个类，存放ta的相关信息
    public $userID;  //扫码获得的微信号
    public $love_anniversary; //相恋纪念日，用于计算在一起天数
    public $birthday_m; //农历出生月份，用于计算生日天数
    public $birthday_d; //农历出生日，用于计算生日天数
    public $city; //所在城市，用于计算天气
    public function __construct( $userID, $love_anniversary, $birthday_m,$birthday_d,$city) {
       $this->userID = $userID;
       $this->love_anniversary = $love_anniversary;
       $this->birthday_m = $birthday_m;
       $this->birthday_d = $birthday_d;
       $this->city = $city;
    }
}

/* 以下为主要程序部分*/

/*第一步：先定义一个对象，把对象的信息放进去*/
$person1 = new Lover($userID='用户id', //拿ta的微信扫描二维码后，后台可见
                $love_anniversary = '2022-01-27',
                $birthday_m = 10,
                $birthday_d = 1,
                $city = '长沙');  // 城市这一项需要注意，需要根据天气接口平台的规则来

/*第二步：准备需要发送的数据*/
// 自己随便准备一句话，作为副标题
$yjh = '小蓝呼叫小红！mua~'; //自定义一句话，随便想说的
// 获取需要的数据(也可以放到format_data中处理,为了节省api调用次数就放在外面了。)
$qinghua = get_tuweiqinghua(); //获取一句土味情话，直接是text
echo '<br> 情话:'.$qinghua;
sleep(5);  //加sleep的原因，是请求频率过高，接口平台会报错
$shici = get_shici(); //获取一句诗词，直接是text
echo '<br> 诗词:'.$shici;
sleep(5);
$dujitang = get_dujitang(); //获取一句毒鸡汤
echo '<br> 鸡汤:'.$dujitang;

/*第三步：把零散的数据整合成array*/
//格式规范参考微信官方文档：https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
//单独封装了 format_data函数，我们直接调用
$template_data = format_data($person1,
            $yjh,
            $qinghua,
            $shici,
            $dujitang);
$lover_data = json_encode($template_data); //转化成json格式，请求中支持json格式
// 修改成自己的微信id，再发一次，便于了解发过去的到底是什么信息，以免翻车（api平台有概率返回一些奇奇怪怪的话）
$template_data['touser'] = 'asdfasdf';  // 用你自己的微信也扫一下二维码，获取这个id，这样发送给ta的通知也会给你自己发送一份。
$myself_data = json_encode($template_data);
//print_r($template_data);

/*第四步：发送 */
send_msg_to_wx($lover_data);
send_msg_to_wx($myself_data);

// 将消息发送给wx服务器的函数
function send_msg_to_wx($wx_data){
    global $ACCESS_TOKEN; //声明全局变量
    //url的规则，见文档中：模板消息->发送模板消息章节
    $url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $ACCESS_TOKEN;
    $res = https_request($url, urldecode($wx_data));
    $res = json_decode($res, true);
    if ($res['errcode'] == 0) {
        echo '发送成功 <br>友情链接：免费主机：http://www.freehost.cc';
    } else {
        echo '发送失败';
    }
}

// 将数据格式化的函数
function format_data($user,$yjh,$qinghua,$shici,$dujitang){ //用于整理数据为微信接收的格式
    echo '<br> 进入函数';
    $love = Num_of_days_since($user->love_anniversary);
    $weather = get_weather($user->city);
    $birthday =Num_of_days_to_next_birthday($user->birthday_m,$user->birthday_d);
    // 整理模板数据
    $template = array(
        'touser' => $user->userID,
        'template_id' => '1EayYGIbJFxpb2uTuUdGLxwbHHPg179pJu8bN34h-Wo', //模板id，换成自己的
        'url' => '', //跳转链接
        'data' => array(
            'first' => array(   //副标题
                'value' => $yjh,
                'color' => "#FF00FF" //这里是最后的字体颜色，大家自定义：https://blog.csdn.net/HB_Programmer/article/details/82729593
            ),
            'thing01' => array(
                'value' => $weather['wea'],
                'color' => "#77FF00"
            ),
            'thing02' => array(
                'value' => $weather['tem_day'],
                'color' => "#33FFDD"
            ),
            'thing03' => array(
                'value' => $love . '天',
                'color' => "#FF0000"
            ),
            'thing04' => array(
                'value' => $birthday . '天',
                'color' => "#33FF33"
            ),
            'remark01' => array(      //备注
                'value' => $qinghua,
                'color' => "#FF00FF"
            ),
            'remark02' => array(      //备注
                'value' => $shici,
                'color' => "#00FFFF"
            ),
            'remark03' => array(      //备注
                'value' => $dujitang,
                'color' => "#EE7700"
            ),
        )
    );
    echo '<br> 退出函数';
    return $template;
}




// 计算在一起的天数
function Num_of_days_since($startday){
    echo '<br> 进入在一起天数函数  ，';
    $now = time();
    $love = ceil(($now - strtotime($startday)) / 86400);
    echo '天数为'.$love;
    return $love;
}
//echo Num_of_days_since($love_anniversary).'<br>';


// 下一个生日是哪一天(这里只做了支持农历的，阳历的很简单有疑问可以留言)
function Num_of_days_to_next_birthday($birthday_m,$birthday_d){
    echo '<br> 进入生日计算函数';
    // 1、计算当前哪一年(暂不考虑农历闰月 和 部分月份（农历11、12月）可能年份不一致问题)
    $now_year = date('Y');
    $lunar = Lunar::fromYmd($now_year,$birthday_m,$birthday_d);
    $birth =  strtotime($lunar->getSolar()); //转出来的时间戳，是当天00:00的
    $now = time();
    // 今天和生日的时间差距 一天86400秒

    if ($now<$birth){//今年的生日还没到
        //计算距离今年生日的天数
        $days = ceil(($birth-$now)/86400);
        echo '今年生日还没到,还有'.$days;
        return $days;
    }elseif($now-$birth<86400){//是生日当天
        echo '今天是生日';
        return '生日快乐！！！宝贝';
    }else{//今年生日已经过了，要计算明年的了
        $next_year_birth = strtotime(Lunar::fromYmd($now_year+1,$birthday_m,$birthday_d)->getSolar());
        $days = ceil(($next_year_birth-$now)/86400);
        echo '今年生日已经过了,明年的生日还有'.$days;
        return $days;
    }
}

function get_weather($city){
    echo '<br> 进入天气获取函数';
    // 为了更好扩展性，天气作为参数传入
    global $weather_api_appid; // 换成自己的id，方法见readme
    global $weather_api_appsecret; //换成自己的secret，方法见readme
    $tianqiurl = 'https://www.yiketianqi.com/free/day?appid='.$weather_api_appid.'&appsecret='.$weather_api_appsecret.'&unescape=1&city='.$city;
    $tianqiapi = https_request($tianqiurl);
    $tianqi = json_decode($tianqiapi, true);
    return $tianqi;
}

function get_tuweiqinghua(){ //获取一句土味情话
    echo '<br> 进入土味情话获取函数';
    global $api_token;
    $qinghuaqiurl = 'https://v2.alapi.cn/api/qinghua?format=text&token='.$api_token;
    $qinghua = https_request($qinghuaqiurl);
    return $qinghua;
}

function get_shici(){ //随机获取一句诗词
    echo '<br> 进入诗词获取函数';
    global $api_token;
    $shiciurl = 'https://v2.alapi.cn/api/shici?format=text&token='.$api_token;
    $shici = https_request($shiciurl);
    return $shici;
}
//get_shici();

function get_joke(){ //随机获取一句笑话
    echo '<br> 进入笑话获取函数';
    global $api_token;
    $jokeurl = 'https://v2.alapi.cn/api/joke/random?token='.$api_token;
    $jokeapi = https_request($jokeurl);
    $joke = json_decode($jokeapi, true);
    return $joke;
}

function get_dujitang(){ //随机获取一句毒鸡汤
    echo '<br> 进入毒鸡汤获取函数';
    global $api_token;
    $dujitangaqiurl = 'https://v2.alapi.cn/api/soul?format=text&token='.$api_token;
    $dujitang = https_request($dujitangaqiurl);
    return $dujitang;
}


function https_request($url, $data = null)
{
    $curl = curl_init();//初始化
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);//不对证书进行校验
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)) { //data不为空的时候，发送post请求
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //需要将返回数据作为变量
    $output = curl_exec($curl); //执行curl请求
    curl_close($curl);
    return $output;
}
